import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import mybatis.domain.BaseDo;

import java.util.Collections;
import java.util.Objects;
import java.util.Scanner;

/**
 * 代码生成器
 * https://mybatis-plus.com
 * https://github.com/baomidou/generator
 * https://gitee.com/baomidou/mybatis-plus-samples
 */
public class MybatisPlusCodeGenerator {
    // =============================================================================================================
    static final String URL = "jdbc:mysql://127.0.0.1:3306/auth?useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai";
    static final String USERNAME = "root";
    static final String PASSWORD = "root";
    // =============================================================================================================
    static final String USER_DIR = System.getProperty("user.dir") + "/common/common-mybatis";
    // =============================================================================================================
    static final String AUTHOR = "jhxxb";

    public static void main(String[] args) {
        // 数据源配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder(URL, USERNAME, PASSWORD).build();

        // 代码生成器
        AutoGenerator mpg = new AutoGenerator(dataSourceConfig);

        // 全局配置
        GlobalConfig gc = new GlobalConfig.Builder()
                .outputDir(USER_DIR + "/src/test/java")
                .author(AUTHOR) // 开发人员
                .disableOpenDir()
                // .enableSwagger() // 实体属性 Swagger 注解，不支持 swagger3
                .build();
        mpg.global(gc);

        // 包配置
        PackageConfig pc = new PackageConfig.Builder()
                .parent("mybatisplus")
                .entity("domain") // 实体类包名
                .pathInfo(Collections.singletonMap(OutputFile.xml, USER_DIR + "/src/test/resources/mapper/")) // 设置 mapperXml 生成路径
                .build();
        mpg.packageInfo(pc);

        // TemplateConfig templateConfig = new TemplateConfig.Builder()
        //         .disable(TemplateType.CONTROLLER, TemplateType.SERVICE, TemplateType.SERVICE_IMPL) // 不生成
        //         .build();
        // mpg.template(templateConfig);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig.Builder()
                .addTablePrefix("t_", "mp_") // 要生成表的前缀，生成时会去掉前缀
                .addInclude(scanner("表名，多个英文逗号分割").split(",")) // 需要生成的表，不设置默认生成所有
                .entityBuilder() // ================================实体策略配置================================
                .enableFileOverride() // 是否覆盖文件
                .superClass(BaseDo.class) // 实体类的父类，没有就不用设置
                .addSuperEntityColumns("create_time", "create_user", "update_time", "update_user", "is_deleted") // 写于父类中的公共字段
                .enableLombok() // 是否为 lombok 模型
                .enableChainModel()
                .enableActiveRecord() // 实体开启 ActiveRecord 模式
                // .addTableFills(new Property("openid", FieldFill.INSERT))  // 表的自动填充字段
                .formatFileName("%sDo") // 自定义文件命名， %s 为占位符
                .controllerBuilder() // ================================controller 策略配置================================
                .enableRestStyle() // 生成 @RestController 控制器
                .mapperBuilder() // ================================Mapper 策略配置================================
                .enableFileOverride() // 是否覆盖文件
                // .enableBaseResultMap() // XML ResultMap
                .enableBaseColumnList() // XML columList
                .build();
        mpg.strategy(strategy);

        mpg.execute(new FreemarkerTemplateEngine()); // 切换为 freemarker 模板引擎执行，默认 velocity 模板引擎
    }

    /**
     * 读取控制台内容
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入" + tip + "：");
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (Objects.nonNull(ipt) && !ipt.isEmpty()) {
                return ipt;
            }
        }
        throw new RuntimeException("请输入正确的" + tip + "！");
    }
}